home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / fn32_3.zip / DTREE.C < prev    next >
C/C++ Source or Header  |  1993-02-07  |  3KB  |  168 lines

  1. /* dtree.c    print directory tree to stdout
  2. **
  3. ** compile:    cl -AC dtree.c fn32argv.obj
  4. **
  5. */
  6. #include "fn32argv.h"
  7.  
  8. typedef struct {
  9.     int    down;
  10.     int    in;
  11.     int id;
  12. }NODE;
  13.  
  14. #define NODEMAX 2000
  15. #define SYMMAX 10000
  16.  
  17. NODE node[NODEMAX];
  18. char symbol[SYMMAX];
  19. char indent [128];
  20. char curid[34];
  21. char arg[] = "/**/*";
  22. int idnum;
  23. int nodecnt;
  24. int cur_node;
  25. int prev_node;
  26.  
  27. main()
  28. {
  29. int i, argc;
  30. char **argv;
  31.  
  32.     argc = 1;
  33.     argv[0] = arg;
  34.     fn32argv(&argc, &argv, NULL, FN32_DIRECTORY);
  35.  
  36.     symbol[1] = 1;
  37.     nodecnt = 1;
  38.     for(i = 0; i < argc; ++i)
  39.         build_tree(argv[i]);
  40.     argv_free(&argc, &argv, NULL); 
  41.     print_tree();
  42. }
  43. build_tree(char *cp)
  44. {
  45.     cur_node = 1;
  46.     prev_node = 0;
  47.  
  48.     while(idnum = nxtid(&cp))
  49.         cur_node = make_node();
  50. }
  51. int make_node()
  52. {
  53.     if(nodecnt > cur_node)
  54.     {
  55.         if(node[cur_node].id == idnum)
  56.         {
  57.             prev_node = cur_node;
  58. try_in:        if(node[cur_node].in > 0)
  59.                     return node[cur_node].in;
  60.             else    return nodecnt;
  61.         }
  62.         prev_node = cur_node;
  63.         while(node[prev_node].down > 0)
  64.         {            
  65.             prev_node = node[prev_node].down;
  66.             if(node[prev_node].id == idnum)
  67.             {
  68.                 cur_node = prev_node;
  69.                 goto try_in;
  70.             }
  71.         }
  72.         node[prev_node].down = cur_node = nodecnt;
  73.     }
  74.     /* add a node */
  75.     if(nodecnt >= NODEMAX-1)
  76.     {
  77.         printf("Too many nodes.\n");
  78.         exit(1);
  79.     }
  80.     node[nodecnt].id = idnum;
  81.     node[nodecnt].down = 0;
  82.     node[nodecnt].in = -1;
  83.     if(        prev_node != nodecnt
  84.         &&     node[prev_node].down == 0
  85.         &&    node[prev_node].in == -1)
  86.     {
  87.         node[prev_node].in = nodecnt;
  88.     }
  89.     prev_node = cur_node;
  90.     return ++nodecnt;
  91. }
  92. int nxtid(char **str)
  93. {
  94. int i, j;
  95. char *cp = *str;
  96. char *idp = curid;
  97.  
  98.     if(!*cp) return 0; /* eos */
  99.  
  100.     /* strip current symbol to 'curid' */
  101.     while(*cp)
  102.     {
  103.         if((*idp = *cp++) == '/')
  104.                 break;
  105.         else    ++idp;
  106.     }
  107.     *idp = 0;
  108.     *str = cp;
  109.  
  110.     /* insert symbol -- this is about as slow as it gets */
  111.     /* but partial symbols are reused thus saving space */
  112.     for(i = 1; symbol[i] != 1; i++)
  113.     {/* o.o.one character at a time */
  114.         if(!strcmp(curid, &symbol[i]))
  115.             return i;
  116.     }
  117.     j = strlen(curid) + 1;
  118.     if(i+j >= SYMMAX)
  119.     {
  120.         printf("Too many symbols.\n");
  121.         exit(2);
  122.     }
  123.     strcpy(&symbol[i], curid);
  124.     symbol[i+j] = 1;
  125.     return i;
  126. }
  127. print_tree()
  128. {
  129.     indent[0] = '\0';
  130.     if(nodecnt > 1)
  131.     {
  132.         prt_node(1);
  133.         trace(2);
  134.     }
  135.     else printf("No tree.\n");
  136. }
  137. trace(int n)
  138. {
  139.     while(node[n].down > 0)
  140.     {
  141.         strcat(indent, "├─");
  142.         prt_node(n);
  143.         indent[strlen(indent)-2] = 0;
  144.         if (node[n].in > 0)
  145.         {
  146.             strcat(indent, "│ ");
  147.             trace(node[n].in);
  148.             indent[strlen(indent)-2] = 0;
  149.         }
  150.         n = node[n].down;
  151.     }
  152.     /* Last node on this level. */
  153.     strcat(indent, "└─");
  154.     prt_node(n);
  155.     indent[strlen(indent)-2] = 0;
  156.     if(node[n].in > 0)
  157.     {
  158.         strcat(indent, "· ");
  159.         trace(node[n].in);
  160.         indent[strlen(indent)-2] = 0;
  161.     }
  162. }
  163. prt_node(int n)
  164. {
  165.     printf("%s%s\n", indent, &symbol[node[n].id]);    
  166. }
  167.  
  168.